/*!
 * Lang module v1.0.0 of jRaiser javascript library
 * http://code.google.com/p/jraiser/
 *
 * Author: Heero.Luo
 * Licensed under MIT license
 *
 * Date: Tue Jul 03 2012 14:41:44 GMT+0800
 */
define(function(require, exports, module) { 'use strict';

var core = require('/core/1.0.x/core');


// String类工具函数
var stringApis = {
	/**
	 * 生成特定数量的重复字符串
	 * @param {String} 要重复的字符串
	 * @param {Number} 重复次数
	 * @return {String} 生成结果
	 */
	times : function(s, count) { return new Array(count + 1).join(s); },

	/**
	 * 格式化字符串
	 * @param {String} 格式化模版，其中的“%N”（N为正整数）将被替换成函数的第N个（从0开始算）参数
	 * @param {String*} 参数值
	 * @return {String} 格式化后的字符串
	 */
	format : function(str) {
		var args = arguments, re = new RegExp('%([1-' + args.length + '])', 'g');
		return String(str).replace(re, function($0, $1) {
			return args[$1];
		});
	},

	/**
	 * 检测字符串中是否包含以指定分隔符隔开的某段子字符串
	 * @param {String} 被测字符串
	 * @param {String} 子字符串
	 * @param {String} 分隔符
	 * @return {Boolean} 是否包含该子字符串
	 */
	has : function(str, substr, sep) {
		return sep !== '' && sep != null ?
			str.indexOf(substr) !== -1 : (sep + str + sep).indexOf(sep + substr + sep) !== -1;
	}
};


// Number类工具函数
var numberApis = {
	/**
	 * 返回数字特定长度的字符串表示，长度不足时在开头用0填充
	 * @param {Number} 数字
	 * @param {Number} 最小长度
	 * @param {Number} 进制，默认为10进制
	 * @return {String} 数字的字符串表示
	 */
	toPaddedString : function(num, len, radix) {
		var str = num.toString(radix || 10), count = len - str.length;
		return count > 0 ? stringApis.times('0', count) + str : str;
	}
};


/**
 * 生成扩展日期
 * @param {Date} 日期
 * @return {Date} 扩展后的日期
 */
var dateApis = function(date) {
	if ( !core.isDate(date) ) {
		date = new Date( Date.apply(this, arguments) );
	}
	return core.mix(date, dateExts, false);
};

// 日期扩展方法
var dateExts = {
	/**
	 * 克隆当前实例
	 * @return 当前实例的副本
	 */
	clone : function() { return dateApis( new Date(this) ); },

	/**
	 * 返回此实例加上特定年份数后的新日期示例
	 * @param {Number} 年份数
	 * @return {Date} 新日期实例
	 */
	addYears : function(y) {
		var ret = this.clone();
		ret.setFullYear(ret.getFullYear() + y);
		return ret;
	},

	/**
	 * 返回此实例加上特定月份数后的新日期示例
	 * @param {Number} 月份数
	 * @return {Date} 新日期实例
	 */
	addMonths : function(m) {
		var ret = this.clone();
		ret.setMonth(ret.getMonth() + m);
		return ret;
	},
	
	/**
	 * 返回此实例加上特定天数后的新日期示例
	 * @param {Number} 天数
	 * @return {Date} 新日期实例
	 */
	addDates : function(d) {
		var ret = this.clone();
		ret.setDate(ret.getDate() + d);
		return ret;
	},
	
	/**
	 * 返回此实例加上特定小时数后的新日期示例
	 * @param {Number} 小时数
	 * @return {Date} 新日期实例
	 */
	addHours : function(h) {
		var ret = this.clone();
		ret.setHours(ret.getHours() + h);
		return ret;
	},

	/**
	 * 返回此实例加上特定分钟数后的新日期示例
	 * @param {Number} 分钟数
	 * @return {Date} 新日期实例
	 */
	addMinutes : function(m) {
		var ret = this.clone();
		ret.setMinutes(ret.getMinutes() + m);
		return ret;
	},
	
	/**
	 * 返回此实例加上特定秒数后的新日期示例
	 * @param {Number} 秒数
	 * @return {Date} 新日期实例
	 */
	addSeconds : function(s) {
		var ret = this.clone();
		ret.setSeconds(ret.getSeconds() + s);
		return ret;
	},
	
	/**
	 * 返回此实例加上特定毫秒数后的新日期示例
	 * @param {Number} 毫秒数
	 * @return {Date} 新日期实例
	 */
	addMilliseconds : function(ms) {
		var ret = this.clone();
		ret.setMilliseconds(ret.getMilliseconds() + ms);
		return ret;
	},
	
	/**
	 * 使用指定的格式将当前日期值转换为字符串表示形式
	 * @param {String} 格式
	 * @return {Date} 日期的字符串表示
	 */
	format : function(f) {
		var t = this, toPaddedString = numberApis.toPaddedString,
			to12Hours = function(hours) { return hours > 12 ? hours - 12 : hours; };
			
		return f ? f.replace(/y+|m+|d+|h+|s+|H+|M+/g, function($0) {
			switch ($0) {
				case 'yyyy': return t.getFullYear();
				case 'yy': return t.getFullYear().toString().slice(-2);
				case 'MM': return toPaddedString(t.getMonth() + 1, 2);
				case 'M': return t.getMonth() + 1;
				case 'dd': return toPaddedString(t.getDate(), 2);
				case 'd': return this.getDate();
				case 'HH': return toPaddedString(t.getHours(), 2);
				case 'H': return this.getHours();
				case 'hh': return toPaddedString(to12Hours( t.getHours() ), 2);
				case 'h': return to12Hours( t.getHours() );
				case 'mm': return toPaddedString(t.getMinutes(), 2);
				case 'm': return t.getMinutes();
				case 'ss': return toPaddedString(t.getSeconds(), 2);
				case 's': return t.getSeconds();
				default: return $0;
			}
		}) : Date.prototype.toString.call(t);
	}
};

// 时区
var d = (new Date).getTimezoneOffset() * - 1,
	tz = {
		s : (d >= 0 ? '+' : '-') +
			numberApis.toPaddedString( Math.abs( parseInt(d / 60) ), 2 ) +
			numberApis.toPaddedString( Math.abs(d % 60), 2 ),
		d : d / 60
	};

core.extend(dateApis, {
	/**
	 * 获取当前时区
	 * @param {String} 时区表示，s为字符串表示，d为数字表示，默认为s
	 * @return {String,Number} 时区值
	 */
	timezone : function(t) { return tz[t || 's']; }
});


core.extend(exports, {
	string : stringApis,
	number : numberApis,
	date : dateApis
});

});